From ec172126eadf558df253c09547cea870512302d4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Juan=20Hern=C3=A1ndez?= Date: Thu, 8 Sep 2016 16:20:36 -0400 Subject: [PATCH] Add ConfigFile struct to handle config file paths. --- src/cargo/util/config.rs | 54 +++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/src/cargo/util/config.rs b/src/cargo/util/config.rs index 0d0a89791..70dadbd98 100644 --- a/src/cargo/util/config.rs +++ b/src/cargo/util/config.rs @@ -22,6 +22,30 @@ use util::toml as cargo_toml; use self::ConfigValue as CV; +#[derive(PartialEq, Eq, Hash)] +struct ConfigFile { + path: Option, +} + +impl ConfigFile { + pub fn new(path: PathBuf) -> ConfigFile { + let canonical = match fs::canonicalize(path) { + Ok(p) => Some(p), + Err(_) => None, + }; + + ConfigFile { path: canonical } + } + + pub fn exist(&self) -> bool { + self.path.is_some() + } + + pub fn as_path_buf(&self) -> Option { + self.path.clone() + } +} + pub struct Config { home_path: Filesystem, shell: RefCell, @@ -676,21 +700,19 @@ fn walk_tree(pwd: &Path, mut walk: F) -> CargoResult<()> where F: FnMut(File, &Path) -> CargoResult<()> { let mut current = pwd; - let mut stash: HashSet = HashSet::new(); + let mut stash: HashSet = HashSet::new(); loop { - let possible = current.join(".cargo").join("config"); - if fs::metadata(&possible).is_ok() { - let canonical = fs::canonicalize(possible).unwrap(); - let string = canonical.to_str().unwrap().to_owned(); - if stash.get(&string).is_none() { - let file = try!(File::open(&canonical)); + let possible = ConfigFile::new(current.join(".cargo").join("config")); + if possible.exist() && stash.get(&possible).is_none() { + let name = possible.as_path_buf().unwrap(); + let file = try!(File::open(&name)); - try!(walk(file, &canonical)); + try!(walk(file, &name)); - stash.insert(string); - } + stash.insert(possible); } + match current.parent() { Some(p) => current = p, None => break, @@ -704,13 +726,11 @@ fn walk_tree(pwd: &Path, mut walk: F) -> CargoResult<()> human("Cargo couldn't find your home directory. \ This probably means that $HOME was not set.") })); - let config = home.join("config"); - let key = config.to_str().unwrap().to_owned(); - if stash.get(&key).is_none() { - if fs::metadata(&config).is_ok() { - let file = try!(File::open(&config)); - try!(walk(file, &config)); - } + let config = ConfigFile::new(home.join("config")); + if config.exist() && stash.get(&config).is_none() { + let name = config.as_path_buf().unwrap(); + let file = try!(File::open(&name)); + try!(walk(file, &name)); } Ok(()) -- 2.30.2